package client.coordinador;

import static client.common.libs.Underscore._;
import static org.stjs.javascript.JSCollections.$array;
import static org.stjs.javascript.JSCollections.$map;

import org.stjs.javascript.Array;
import org.stjs.javascript.Map;

import client.common.EndPoints.CoordinadorEP;
import client.common.Models.Curso;
import client.common.Models.Grado;
import client.common.Models.MateriaCurso;
import client.common.angular.EmptyPromise;
import client.common.angular.NgScope;
import client.common.angular.UIState;
import client.common.directives.EPLoading;
import client.common.javascript.JsConsole;
import client.common.javascript.JsProcedure1;
import client.common.javascript.JsWindow;

public class AdminCursosScope extends NgScope {
	private Map<String, Grado> gradosMap;
	private Array<Grado> grados;
	private Map<String, Array<Curso>> cursosGrado;
	private EPLoading epLoading;
	private CoordinadorEP Coordinador;
	private UIState $state;

	public AdminCursosScope(final CoordinadorEP Coordinador, JsWindow $window,
			UIState $state, EPLoading epLoading) {
		super("AdminCursosScope");
		this.epLoading = epLoading;
		this.Coordinador = Coordinador;
		this.$state = $state;
		this.gradosMap = $map();
		this.cursosGrado = $map();

		final AdminCursosScope that = this;

		this.grados = Coordinador.getGrados(new JsProcedure1<Array<Grado>>() {

			@Override
			public void $invoke(Array<Grado> data) {
				for (int i = 0; i < that.grados.$length(); i++) {
					Grado grado = that.grados.$get(i);
					that.cursosGrado.$put("" + grado.id,
							Coordinador.getCursosGrado(grado.id));

					that.gradosMap.$put(grado.id + "", grado);
				}
			}
		});
	}

	public void agregarCurso(Grado grado) {
		// FIXME Bloquear las acciones del usuario hasta que
		// responsa el
		// servidor

		String prefix = grado.prefijo + "";
		Array<Curso> cursos = cursosGrado.$get(grado.id + "");
		if (cursos == null) {
			cursos = $array();
			cursosGrado.$put(grado.id + "", cursos);
		}

		String suffix = cursos.$length() + 1 + "";

		if (suffix.length() < 2)
			suffix = "0" + suffix;
		Curso curso = new Curso();
		curso.nombre = prefix + suffix;
		curso.idGrado = grado.id;
		final Array<Curso> cursos1 = cursos;

		epLoading.$invoke(
				Coordinador.newCurso(curso, new JsProcedure1<Curso>() {
					public void $invoke(Curso data) {
						cursos1.push(data);
					}
				}), "#divGrado" + grado.id);
	}

	public void borrarCurso(final Curso item) {
		// TODO agregar EPLoading

		final AdminCursosScope that = this;
		Coordinador.deleteCurso(item.id, new JsProcedure1<EmptyPromise>() {

			@Override
			public void $invoke(EmptyPromise p) {
				Array<Curso> cursos = that.cursosGrado.$get(item.idGrado + "");
				cursos.splice(_.map(cursos, "id").indexOf(item.id), 1);

			}
		});

	}

	public void mostrar(final Curso curs) {
		JsConsole.console.log(curs);
		$state.transitionTo("admin.curso", new MateriaCurso() {
			{
				idCurso = curs.id;
			}
		});
	}

	public static Array<String> $inject() {
		return $array("Coordinador", "$window", "$state", "epLoading");
	}
}
